#if !defined(ximera_physics_irigidbody_hpp)
#define ximera_physics_irigidbody_hpp

// -----------------------------------------------------------

#include <ximera/common/imovable.hpp>
#include <ximera/enum.hpp>

namespace ximera { namespace physics
{
    namespace BodyFlag
    {
        typedef unsigned long type;
        type const 
            NoGravity      = (1 << 0),
            NoCollision    = (1 << 1),
            NoResponse     = (1 << 2);
    }
    typedef BodyFlag::type BodyFlagT;

    class XIMERA_API IRigidBody : public IMovable
    {
    public:
		virtual ~IRigidBody();

        virtual math::Vector3 linearVelocity() const = 0;
        virtual void linearVelocity(math::Vector3 const& vel) = 0;

        virtual math::Vector3 angularVelocity() const = 0;
        virtual void angularVelocity(math::Vector3 const& vel) = 0;

        virtual Real mass() const = 0;
        virtual void mass(Real value) = 0;

        virtual math::Vector3 force() const = 0;
        virtual void force(math::Vector3 const& value) = 0;

        virtual math::Vector3 torque() const = 0;
        virtual void torque(math::Vector3 const& value) = 0;

        virtual bool enabled() const = 0;
        virtual void enabled(bool value) = 0;

        virtual BodyFlagT flags() const = 0;
        virtual void flags(BodyFlagT value) = 0;

        virtual bool isFlagSet(BodyFlagT value) const = 0;
        virtual void setFlag(BodyFlagT value) = 0;
        virtual void unsetFlag(BodyFlagT value) = 0;
    };
}}

// -----------------------------------------------------------

#endif
